package main

import (
	"fmt"
	"net"  //socket开发必需的
)

func dealConn(conn net.Conn)  {
	
	defer conn.Close()

	for {
		//创建一个切片用来接收输入
		input := make([]byte,1024)

		fmt.Printf("服务端在等待%v输入\n",conn.RemoteAddr().String())
		nums, err := conn.Read(input)   //如果客户端没有发送信息，那么协程就阻塞在这里
		
		if err != nil {
			fmt.Println("读取客户端输入错误，err=",err)
			return
		}
		fmt.Print("客户端输入:",string(input[:nums]))
	}
}

func main()  {
	fmt.Println("服务器启动")

	listen,err := net.Listen("tcp","0.0.0.0:8888")
	if err != nil {
		fmt.Println("listen err=",err)
		return  //!!!  如果没有退出，则该协程一直报错
	}

	//退出main函数时关闭连接
	defer listen.Close()

	for{
		fmt.Println("等待用户来连接")
		//程序会阻塞等待连接
		conn,err := listen.Accept()

		if err != nil{
			fmt.Println("Accept() err=",err)
		}else {
			fmt.Printf("连接是=%v,连接ip地址是=%v\n",conn,conn.RemoteAddr().String())
		}

		//准备一个协程，为conn服务
		go dealConn(conn)
	}
}

